package org.example.pro2_apobase.cglibproxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;


import java.lang.reflect.Method;


public class MyInterceptor implements MethodInterceptor {
    //第二步====================
    //调用代理类也会取目标类的方法，所以需要目标类的对象
    //目标对象
    private Object target;
    public MyInterceptor(Object target){
        this.target=target;
    }

    public Object getProxy(){
        Enhancer en=new Enhancer();
        en.setSuperclass(target.getClass());
        en.setCallback(this);
        return en.create();
    }
    @Override

    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        //第5步
        //实现增强方法的逻辑
        //前置增强  目标类方法还没执行，先进行判定权限
        if(method.getName().startsWith("save")||method.getName().startsWith("update")){  //@Pointcut("execution(* org.example.pro1.service.*.save*(..))")  //切入点表达式
            checkRight();
        }
        //目标类的方法执行   目标类的方法执行
        Object returnValue=method.invoke(target,args);
        //后置增强
        if(method.getName().startsWith("find")||method.getName().startsWith("show")){  //@Pointcut("execution(* org.example.pro1.service.*.find*(..))")  //切入点表达式
            log();
        }


        return returnValue;
    }


    //第四步==============================
    //增强方法  对目标类的方法进行增强
    //第5步相当于 在方法上面加入注解
    //@Before
    public void checkRight(){
        System.out.println("==================");
        System.out.println("权限验证通过");
        System.out.println("===============");
    }

    //@After
    public void log(){
        System.out.println("==================");
        System.out.println("输出日志");
        System.out.println("==================");
    }
}
